package JavaGuide;

import javax.swing.plaf.synth.SynthOptionPaneUI;

public class TestString {
    public static void main(String[] args) {
//        为什么string是不可以修改，不可变的的
//          1 保存字符串的数组被 final 修饰且为私有的，并且String 类没有提供/暴露修改这个字符串的方法。
//          2 String 类被 final 修饰导致其不能被继承，进而避免了子类破坏 String 不可变。
        String S1 = "HELLO";
        System.out.println(S1.hashCode());
        S1 = "WORLD";
        System.out.println(S1.hashCode());//是不相等的
//        字符串拼接时使用+还是用StringBuilder 其实+还是内部调用StringBuilder的append()方法
        String[] arr = {"he", "llo", ",world"};
        StringBuilder newsString=new StringBuilder();
        int i=0;
        for (i = 0; i < arr.length;++i){
            newsString.append(arr[i]);
        }
        System.out.println(newsString);


//    记住 String的equals()方法是被重写过的
//    字符串常量池 是为了提升JVM的性能和减少内存消耗专门为字符串开辟的一块区域，主要目的是为了防止字符串的重复创建
//    常量与String类型变量相加会发生什么
        String s1="str";
        String s2="ing";
        String s3=s1+s2;//会在堆上创建新的对象
        String s4="str"+"ing";
        String s5="string";
        System.out.println(s3==s4);//false

//        但是如果是final修饰就相当于常量池的常量
        final String s6="str";
        final String s7="ing";
        String s8=s6+s7;
        System.out.println(s8==s4);//true

    }

}
